package com.witsight.platform.util.tools;

import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.i18n.LocaleContextHolder;

import com.witsight.platform.util.lang.BeanUtil;

/**   
 * 说明：多国语言配置工具类
 * @Title: MessageUtil.java 
 * @Package com.witsight.platform.util.tools 
 * @See: {@link MessageSource}
 * 
 * <br/>
 * Copyright: Copyright (c) 2017<br/>
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年10月11日 下午3:50:36 
 * @version: V1.0
 *
 */
public abstract class MessageUtil {
	/**
	 * 说明：定义后能再同一类中使用static常量log
	 */
	private static final Logger log = LoggerFactory.getLogger(MessageUtil.class);
	private final static MessageSource defaultMessageSource = new DefaultMessageSource();
	/**
	 * 
	 * 说明：取得MessageSource对象
	 * @Title: com.witsight.platform.util.tools.SpringUtil.getBeanByType
	 * @See: {@link #getMessageSource()}
	 * @author penght
	 * @return MessageSource对象
	 * @date: 2017年10月11日 下午3:52:41
	 */
	private static MessageSource getMessageSource() {
		MessageSource messageSource = SpringUtil.getBeanByType(MessageSource.class);
		return messageSource == null ? defaultMessageSource : messageSource;
	}
	/**
	 * 
	 * 说明：默认的多国语言对象
	 * @Title: MessageUtil.java 
	 * @Package com.witsight.platform.util.tools 
	 * @See: {@link MessageSource}
	 * Copyright: Copyright (c) 2017
	 * Company:sany huax witsight team by product
	 * @author: penght   
	 * @date: 2017年10月11日 下午3:59:12 
	 * @version: V1.0
	 *
	 */
	private static class DefaultMessageSource implements MessageSource {

		@Override
		public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
			return code;
		}

		@Override
		public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
			return code;
		}

		@Override
		public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
			return resolvable.getDefaultMessage();
		}		
	}
	/**
	 * 
	 * 说明：取得属性文件中配置的代码对应的文字
	 * @Title: getMessage
	 * @See: {@link #getMessage(MessageSourceResolvable, Locale)}
	 * @author penght
	 * @param resolvable Interface for objects that are suitable for message resolution in a
	 * @return 对应的文字
	 * @date: 2017年10月11日 下午4:09:32
	 */
	public static String getMessage(MessageSourceResolvable resolvable) {
		MessageSource messageSource = getMessageSource();
		Locale locale = LocaleContextHolder.getLocale();
		try {
			return messageSource.getMessage(resolvable, locale);
		} catch (Exception e) {
			log.warn("message parse error.",e);
		}
		
		return "";
	}
	
	/**
	 * 
	 * 说明：取得属性文件中配置的代码对应的文字
	 * @Title: getMessage
	 * @See: {@link #getMessage(String, Object[], String)}
	 * @author penght
	 * @param code  代码
	 * @param args 参数
	 * @return 消息内容
	 * @date: 2017年10月11日 下午4:06:21
	 */
	public static String getMessage(String code) {
		return getMessage(code, null);
	}
	/**
	 * 
	 * 说明：取得属性文件中配置的代码对应的文字
	 * @Title: getMessage
	 * @See: {@link #getMessage(String, Object[], String)}
	 * @author penght
	 * @param code  代码
	 * @param args 参数
	 * @return 消息内容
	 * @date: 2017年10月11日 下午4:06:21
	 */
	public static String getMessage(String code, Object[] args) {
		MessageSource messageSource = getMessageSource();
		Locale locale = LocaleContextHolder.getLocale();
		try {
			return messageSource.getMessage(code, args, locale);
		} catch (Exception e) {
			log.warn("message parse error.",e);
		}
		
		return "";
	}
	/**
	 * 
	 * 说明：取得属性文件中配置的代码对应的文字
	 * @Title: getMessage
	 * @See: {@link #getMessage(String, Object[], String)}
	 * @author penght
	 * @param code  代码
	 * @param args 参数
	 * @param defaultMessage 默认的消息，如果不存在的情况
	 * @return 消息内容
	 * @date: 2017年10月11日 下午4:06:21
	 */
	public static String getMessage(String code, Object[] args, String defaultMessage) {
		MessageSource messageSource = getMessageSource();
		Locale locale = LocaleContextHolder.getLocale();
		try {
			return messageSource.getMessage(code, args, defaultMessage, locale);
		} catch (Exception e) {
			log.warn("message parse error.",e);
		}
		
		return "";
	}
}
